iT邦幫忙

2024 iThome 鐵人賽

DAY 10
0
Kubernetes

異世界生存戰記:30天煉成GKE大師系列 第 10

Day10 Ingress 說再見!GKE Gateway API 開啟新紀元

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20240924/20169017QowhQeJ93G.png

前言

隨著雲原生應用程序的普及,入口流量管理的需求也在增加。Kubernetes 的 Ingress 控制器雖然可以滿足基本的入口流量需求,但是它存在一些限制。為了提供更加靈活和強大的入口管理功能,因此 Kubernetes 1.22 中引入的新功能 Gateway API。

Gateway API 是一種新的入口控制器,提供了 extensible 的入口管理模型,支持多種入口協議和 advanced 的流量管理功能。透過 Gateway API,您可以實現更加複雜的入口管理場景,提高應用程序的可用性和安全性。在這篇文章中,我們將探討 Kubernetes Gateway API 的概念、架構和使用方法,讓讀者更好地理解這個強大的入口控制器。

Gateway API 簡介

Gateway API 是一個官方的 Kubernetes 專案,專注於 Kubernetes 中的 L4 和 L7 路由。該專案代表了下一代 Kubernetes Ingress、Load Balancing 和 Service Mesh API。從一開始,它就被設計為通用的、富有表現力的和面向角色的。

整個資源模型側重於 3 個單獨的角色和他們需要管理的相應資源:

https://ithelp.ithome.com.tw/upload/images/20240924/20169017Lwd2thckuw.png

此 API 中的大部分配置都包含在 Routing 層中。這些特定於協議的資源(HTTPRoute、GRPCRoute 等)為 Ingress 和 Mesh 啟用了高級路由功能。

當使用 Gateway API 管理入口流量時,Gateway 資源定義了一個訪問點,流量可以在該訪問點上跨多個上下文路由。例如,從集群外部路由到集群內部(北/南流量)。

每個 Gateway 都與一個 GatewayClass 相關聯,該 GatewayClass 描述了將處理 Gateway 流量的實際閘道控制器類型,然後,各個路由資源(例如 HTTPRoute將與 Gateway 資源相關聯

將這些不同的關注點分為不同的資源是 Gateway 面向角色性質的關鍵部分以及允許多種閘道控制器(GatewayClass 資源)。

GKE Gateway API 簡介

GKE Gateway API 是一種以角色為導向的資源模型,專為與 GKE 網絡進行交互的角色而設計。如下圖所示,此模型采用了一種能夠為平台管理員集中處理政策和控制措施的方法,讓不同的非協調服務所有者能夠安全地共享同一底層網絡基礎架構。

https://ithelp.ithome.com.tw/upload/images/20240924/20169017lHx7m2kJuk.png

Gateway API 包含以下資源類型:

  • GatewayClass:定義集群範圍的資源以作為在集群中創建負載均衡器的模板。GKE 提供可在 GKE 集群中使用的 GatewayClass。
  • Gateway:定義負載均衡器監聽流量的位置和方式。集群運營商根據 GatewayClass 在其集群中創建網關。GKE 會創建負載均衡器,用於實現 Gateway 資源中定義的配置。
  • HTTPRoute:定義用於將請求從網關路由到 Kubernetes 服務的特定於協議的規則。GKE 支持 HTTPRoute 以用於基於 HTTP(S) 的流量路由。應用開發者會創建 HTTPRoute 以使用網關公開其 HTTP 應用。
  • Policy:定義網關資源的一組特定於實現的特征。您可以將政策附加到網關、路由或 Kubernetes Service。

GEK 的網關所有權和使用模式有以下不同的部署形式:

  • 自行管理的網關

https://ithelp.ithome.com.tw/upload/images/20240924/20169017WQ0teRvaCX.png

  • 每個命名空間的平台管理網關

https://ithelp.ithome.com.tw/upload/images/20240924/20169017EEL6DFbSXC.png

  • 每個集群的共享網關

https://ithelp.ithome.com.tw/upload/images/20240924/20169017QhS0uSAfxl.png

  • 每個艦隊的共享網關

https://ithelp.ithome.com.tw/upload/images/20240924/20169017AN8Tp6fEtO.png

本篇文章的內容會著重於示範部署跨命名空間共享網關

GKE Gateway Controller 要求

  • 對於標準版,需要 GKE 1.24 或更高版本。
  • 僅 VPC 原生集群支持 Gateway API。
  • 如果您使用的是內部 GatewayClass,則必須啟用代理專用子網。(開啟 Proxy Subnet)
  • 集群必須啟用 HttpLoadBalancing 插件。
  • 如果您使用的是共享 VPC,則需要在宿主項目中將 Compute Network User 角色分配給服務項目的 GKE 服務賬號。

GCP 設定配置

進入 GKE 頁面打開 Gateway API 及 HTTP 負載平衡,或是在 Terraform 設定gateway_api_channel="CHANNEL_STANDARD"http_load_balancing參數

Terraform 參數設定

module "gke" {
  gateway_api_channel = "CHANNEL_STANDARD"
  http_load_balancing = true
}

https://ithelp.ithome.com.tw/upload/images/20240924/20169017Euc4afuVQE.png

輸入 kubectl get gatewayclass 指令確認集群中安裝了 GatewayClass
一般的 VPC 原生集群而不是 Anthos Fleet 的話會只顯示以下四種 GatewayClass

$ kubectl get gatewayclass
NAME                               CONTROLLER                  ACCEPTED
gke-l7-global-external-managed     networking.gke.io/gateway   True    
gke-l7-gxlb                        networking.gke.io/gateway   True    
gke-l7-regional-external-managed   networking.gke.io/gateway   True    
gke-l7-rilb                        networking.gke.io/gateway   True    
GatewayClass Name
gke-l7-global-external-managed 基於全球外部應用負載均衡器構建的全球外部應用負載均衡器
gke-l7-gxlb 基於傳統應用負載均衡器構建的全球外部應用負載均衡器
gke-l7-regional-external-managed 基於區域級外部應用負載均衡器構建的區域外部應用負載均衡器
gke-l7-rilb 基於內部應用負載均衡器構建的內部應用負載均衡器

示範

先安裝後端組件,有store-v1store-v2store-german三種不同的 Pod 以及其 Service

$ kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/main/gateway/gke-gateway-controller/app/store.yaml
$ kubectl get svc -n default

NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes     ClusterIP   10.120.96.1      <none>        443/TCP        7d1h
store-german   ClusterIP   10.120.99.0      <none>        8080/TCP       21h
store-v1       ClusterIP   10.120.101.86    <none>        8080/TCP       21h
store-v2       ClusterIP   10.120.109.169   <none>        8080/TCP       21h



$ kubectl get pods -n default

NAME                            READY   STATUS    RESTARTS   AGE
store-german-54485d9d46-ks527   1/1     Running   0          21h
store-german-54485d9d46-pp27j   1/1     Running   0          21h
store-v1-8c5f47dbb-2tnnb        1/1     Running   0          21h
store-v1-8c5f47dbb-k64bt        1/1     Running   0          21h
store-v2-86598d766d-bw8fn       1/1     Running   0          21h
store-v2-86598d766d-ngsbb       1/1     Running   0          21h

設定跨 Namespace 的共享網關,如下圖

https://ithelp.ithome.com.tw/upload/images/20240924/20169017GCcnNKoq2g.png

external-gateway網關部署到命名空間gateway

apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: external-gateway
  namespace: gateway
spec:
  gatewayClassName: gke-l7-gxlb
  listeners:
  - name: http
    hostname: "gateway.demoit.shop"
    protocol: HTTP
    port: 80
    allowedRoutes:
      kinds:
      - kind: HTTPRoute
      namespaces:
        from: Selector
        selector:
          matchLabels:
            shared-gateway-access: "true"

https上述網關中的偵聽器與網域的流量 相符gateway.demoit.shop。這使得基礎設施團隊能夠管理網域的各個方面。下面的 HTTPRoutes 不需要指定網域,如果hostname不設置,將預設匹配所有流量。這使得管理 HTTPRoutes 變得更容易,因為它們可以與網域無關,這在應用程式網域不是靜態時很有幫助。

此網關使用 Namespace 選擇器 (Annotations) 來定義允許附加哪些 HTTPRoutes。這使得基礎設施團隊可以透過將一組 Namespace 列入白名單來限制誰或哪些應用程式可以使用此網關。

進入 GKE 的 Gateway、Service 與 Ingress 子頁面,可以看到創建出來的 Gateway 物件及其 IP

https://ithelp.ithome.com.tw/upload/images/20240924/20169017gYNTKChkkG.png

先將產生的 Loadbalance IP DNS 紀錄綁定上去

接下來將 default 命名空間加入白名單, labels.shared-gateway-access: "true",並且創建 HTTPRoute

apiVersion: v1
kind: Namespace
metadata:
  name: default
  labels:
    shared-gateway-access: "true"
---
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: store-external
spec:
  parentRefs:
  - kind: Gateway
    name: external-gateway
    namespace: gateway
  hostnames:
  - "gateway.demoit.shop"
  rules:
  - backendRefs:
    - name: store-v1
      port: 8080
  - matches:
    - headers:
      - name: env
        value: canary
    backendRefs:
    - name: store-v2
      port: 8080
  - matches:
    - path:
        value: /de
    backendRefs:
    - name: store-german
      port: 8080

完成後可以看到後端服務如下

https://ithelp.ithome.com.tw/upload/images/20240924/20169017mxUW9hEIIS.png

從前端發起請求測試

https://ithelp.ithome.com.tw/upload/images/20240924/20169017k6ftpdUhnq.png

總結

GKE Gateway API 代表了 Kubernetes 入口流量管理的未來方向,它提供更強大、靈活和安全的解決方案,滿足現代雲原生應用程序的需求。下篇會更詳細的介紹 Gateway API 的其他使用方法。

參考文件


上一篇
Day9 告別網站危機 Google Trust Services 證書及External DNS
下一篇
Day11 GKE Gateway API 輕鬆駕馭微服務流量
系列文
異世界生存戰記:30天煉成GKE大師30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言